package syf.hash;

/**
 * Hash表
 */
public class HashTableDemo {
    public static void main(String[] args) {
        HashTable hashTable=new HashTable(15);
        Emp emp1=new Emp(12,"syf");
        Emp emp2=new Emp(123,"wfl");
        Emp emp3=new Emp(6782,"syfwfl");
        hashTable.add(emp1);
        hashTable.add(emp2);
        hashTable.add(emp3);
        hashTable.list();
        System.out.println(hashTable.findById(7));
    }
}
class HashTable{
    private EmpLinkList[] empLinkList;
    private int size;//表示共有多少条链表
    /**
     * 构建哈希表的大小
     * @param size 大小
     */
    public HashTable(int size) {
        this.size=size;
        empLinkList=new EmpLinkList[size];
        //empLinkList[]里面的为空
        for (int i=0;i<size;i++){
            empLinkList[i]=new EmpLinkList();
        }
    }
    /**
     * 添加雇员
     */
    public void add(Emp emp) {
        int num=hashFun(emp.getId());
        empLinkList[num].add(emp);
    }
    /**
     * 遍历所有的链表
     */
    public void list() {
        for (int i=0;i<size;i++) {
            empLinkList[i].displayAll(i);
        }
    }
    /**
     * 根据id查找
     */
    public Emp findById(int id) {
        int num=hashFun(id);
        return empLinkList[num].findEmp(id);
    }
    /**
     * 散列函数
     * @param id 需添加雇员的id号
     * @return 返回膜
     */
    public int hashFun(int id){
        return id%size;
    }
}
class EmpLinkList{
    private Emp head;

    /**
     * 添加雇员
     * @param emp 雇员
     *            当添加雇员时，id是自增的，id的分配总是从小到大
     *            因此我们将该雇员直接添加到本链表的最后即可
     */
    public void add(Emp emp){
        if (head==null){
            head=emp;
        }else {
            Emp curr=head;
            while (curr.getNext()!=null){
                curr=curr.getNext();
            }
            curr.setNext(emp);
        }
    }
    public void displayAll(int no){
        if (head==null){
            System.out.println("第"+(no+1)+"条链表没有雇员信息");
            return;
        }
        Emp curr=head;
        do{
            System.out.println("第"+(no+1)+"条链表雇员信息为"+"id:"+curr.getId()+"姓名:"+curr.getName());
            curr=curr.getNext();
        }while(curr!=null);
    }
    public Emp findEmp(int id){
        if (head != null) {
            Emp curr = head;
            do {
                if (curr.getId() == id) {
                    return new Emp(curr.getId(), curr.getName());
                }
                curr = curr.getNext();
            } while (curr != null);
        }
        return null;
    }
}

/**
 * 雇员实体类
 */
class Emp{
    private int id;
    private String name;
    private Emp next;
    public Emp(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public Emp() {
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Emp getNext() {
        return next;
    }

    public void setNext(Emp next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}